package pe.edu.upc.dew.bibliotecaweb.dao;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import pe.edu.upc.dew.bibliotecaweb.model.Ejemplar;
import pe.edu.upc.dew.bibliotecaweb.model.Libro;

/**
 * Clase EjemplarDao , contiene la implementacion de metodos que acceden a la BD para procesar
 * u obtener informacion de los ejemplares.
 * @author DEW 2010
 */
public class EjemplarDao {

    private List<Ejemplar> ejemplares;

    /**
     * Metodo que retorna una lista de objetos de tipo ejemplar correspondiente a un libro
     * @param libro, objeto libro del cual se desean obtener todos sus ejemplares
     * @return, devuelve una lista con todos los ejemplares del libro
     */
    public List<Ejemplar> getEjemplaresporLibro(Libro libro) {
        ejemplares = new ArrayList<Ejemplar>();
        Ejemplar ejemplar = new Ejemplar();
        Integer _i = 1;

        while (libro.getIdLibro() + 1 >= _i) {
            ejemplar.setIdEjemplar(_i);
            ejemplar.setLibro(libro);
            ejemplares.add(ejemplar);
            _i = _i + 1;
        }
        return ejemplares;
    }

    /**
     * Metodo que obtiene un ejemplar, correspondiente a un libro, cuyo estado se encuentre como disponible
     * @param idLibro codigo del libro del cual se desea obtener el ejemplar
     * @return devuelve el codigo del ejemplar que se encuentra en estado disponible, correspondiente a un libro
     */
    public int getIdEjemplar(int idLibro) {
        Connection cnt = null;
        Statement st = null;
        ResultSet rs = null;
        int idEjemplar = 0;
        try {
            cnt = ConnectionUtils.getConnection();
            st = cnt.createStatement();
            //Se hace la consulta utilizando un MAX porque no funciona el TOP 
            rs = st.executeQuery("SELECT MAX(IDEJEMPLAR) AS IDEJEMPLAR FROM EJEMPLAR E INNER JOIN LIBRO L " +
                    "ON E.IDLIBRO = L.IDLIBRO WHERE E.IDLIBRO =" + idLibro + " AND ESTADOEJEMPLAR = 'D'");
            if (rs.next()) {
                idEjemplar = rs.getInt("IDEJEMPLAR");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ConnectionUtils.closeResultSet(rs);
            ConnectionUtils.closeStatement(st);
            ConnectionUtils.closeConnection(cnt);
        }
        return idEjemplar;
    }

    /**
     * Metodo que actualiza el estado de un ejemplar a "prestado"
     * @param idEjemplar codigo del ejemplar que se desea actualizar.
     */
    public void actualizaEstadoEjemplar(int idEjemplar) {
        Connection cnt = null;
        Statement st = null;
        try {
            cnt = ConnectionUtils.getConnection();
            st = cnt.createStatement();
            st.execute("UPDATE EJEMPLAR SET ESTADOEJEMPLAR='P' WHERE IDEJEMPLAR = " + idEjemplar);
            System.out.println("SE ACTUALIZO EL ESTADO DEL EJEMPLAR CORRECTAMENTE");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ConnectionUtils.closeStatement(st);
            ConnectionUtils.closeConnection(cnt);
        }
    }

   /**
     * Metodo que actualiza el estado de un ejemplar a "disponible"
     * @param idEjemplar codigo del ejemplar que se desea actualizar.
     */
    public void actualizaEstadoEjemplarDevolucion(Integer idEjemplar) {
        Connection cnt = null;
        Statement st = null;
        try {
            cnt = ConnectionUtils.getConnection();
            st = cnt.createStatement();
            st.execute("UPDATE EJEMPLAR SET ESTADOEJEMPLAR='D' WHERE IDEJEMPLAR = " + idEjemplar);
            System.out.println("SE ACTUALIZO EL ESTADO DEL EJEMPLAR DEVUELTO CORRECTAMENTE");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ConnectionUtils.closeStatement(st);
            ConnectionUtils.closeConnection(cnt);
        }
    }
    
    /**
     * Implementa la logica para acceder a la BD y registrar en la tabla correspondiente los datos de los ejemplares
     * @param libro entidad libro que contiene el codigo del mismo y la cantidad de ejemplares a registrar en la tabla
     */
    public void add(Libro libro){
        Connection cnt = null;
        Statement st = null;
        try {
            cnt = ConnectionUtils.getConnection();
            st = cnt.createStatement();
            
            Integer i = 1;
                                   
            while (libro.getNumEjem() >= i){
                st.execute("INSERT INTO EJEMPLAR (ESTADOEJEMPLAR, IDLIBRO) " +
                        "VALUES ('D'" + "," + libro.getIdLibro() + ")");
                i = i + 1;                
            }                                
            
            System.out.println("Se registraron los ejemplares correctamente");
            
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ConnectionUtils.closeStatement(st);
            ConnectionUtils.closeConnection(cnt);
        }
    }  
       
}
